package com.edu.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/*
*       一些列的以 Aware 结尾的 接口
*           Spring容器 管理的对象 如果实现了 BeanNameAware接口
*               容器就会在对象创建完毕，属性注入之后 。
*               执行该接口的方法 注入该bean的名字
*
*           ApplicationContextAware接口的作用:
*            容器就会在对象创建完毕，属性注入之后 。
 *               执行该接口的方法 注入容器自身。
* */
public class User implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {

    private int userId;

    private String username;

    private String password;

    private String beanName;

    private ApplicationContext context;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        System.out.println("2 执行了 user对象的 setter方法");
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public User() {

        System.out.println("1 执行了无参构造方法");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("3 执行了 beanNameAware接口的方法");
       this.beanName = s;
    }

    public String getBeanName() {
        return beanName;
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
        System.out.println("4.执行了 ApplicationContextAware接口的方法");
    }

    public ApplicationContext getContext() {
        return context;
    }

    //自定义 初始化方法 要求配置 init-method
    public void myInit(){
        System.out.println("7 执行了自定义的初始化方法");
        this.userId = 2;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("6 执行了 InitializingBean 接口的初始化方法");
        this.userId = 3;
    }


    public void myDestroy(){
        this.userId = 6;
        System.out.println("11 执行了自定义的销毁方法");
    }

    public void sayHi(){
        System.out.println("7 执行了 user对象自己的业务功能 跟人打招呼");
    }

    @Override
    public void destroy() throws Exception {
        this.userId = 5;
        System.out.println("10 执行了DisposableBean接口的销毁方法");
    }
}
